package com.cencat.merchant.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.cencat.merchant.entity.RouteInvoice;
import com.cencat.merchant.vo.RouteInvoiceVO;
import com.cencat.merchant.dto.RouteInvoiceDTO;
import com.cencat.merchant.dto.RouteInvoiceQueryDTO;
import com.cencat.merchant.dto.RouteInvoiceBatchUpdateDTO;
import com.cencat.merchant.dto.RouteInvoiceStatisticsDTO;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 路线发票管理服务接口
 * 提供路线发票的增删改查、统计分析、税务分析、合规性检查等功能
 * 
 * @author cencat
 * @version 1.0
 * @since 2025-01-20
 */
public interface RouteInvoiceService {

    /**
     * 分页查询路线发票列表
     * 
     * @param page 分页参数
     * @param queryDTO 查询条件
     * @return 路线发票分页数据
     */
    Page<RouteInvoiceVO> getRouteInvoiceList(Page<RouteInvoice> page, RouteInvoiceQueryDTO queryDTO);

    /**
     * 根据ID查询路线发票详情
     * 
     * @param id 发票ID
     * @return 路线发票详情
     */
    RouteInvoiceVO getRouteInvoiceById(Long id);

    /**
     * 创建路线发票
     * 
     * @param routeInvoiceDTO 路线发票信息
     * @return 创建结果
     */
    boolean createRouteInvoice(RouteInvoiceDTO routeInvoiceDTO);

    /**
     * 更新路线发票
     * 
     * @param id 发票ID
     * @param routeInvoiceDTO 路线发票信息
     * @return 更新结果
     */
    boolean updateRouteInvoice(Long id, RouteInvoiceDTO routeInvoiceDTO);

    /**
     * 删除路线发票
     * 
     * @param id 发票ID
     * @return 删除结果
     */
    boolean deleteRouteInvoice(Long id);

    /**
     * 批量删除路线发票
     * 
     * @param ids 发票ID列表
     * @return 删除结果
     */
    boolean batchDeleteRouteInvoices(List<Long> ids);

    /**
     * 批量更新发票类型
     * 
     * @param ids 发票ID列表
     * @param invoiceType 发票类型
     * @return 更新结果
     */
    boolean batchUpdateInvoiceType(List<Long> ids, String invoiceType);

    /**
     * 批量更新发票税率
     * 
     * @param ids 发票ID列表
     * @param taxRate 税率
     * @return 更新结果
     */
    boolean batchUpdateTaxRate(List<Long> ids, BigDecimal taxRate);

    /**
     * 批量更新发票金额
     * 
     * @param ids 发票ID列表
     * @param invoiceAmount 发票金额
     * @return 更新结果
     */
    boolean batchUpdateInvoiceAmount(List<Long> ids, BigDecimal invoiceAmount);

    /**
     * 批量更新路线发票状态
     * 
     * @param batchUpdateDTO 批量更新信息
     * @return 更新结果
     */
    boolean batchUpdateRouteInvoiceStatus(RouteInvoiceBatchUpdateDTO batchUpdateDTO);

    /**
     * 获取路线发票统计信息
     * 
     * @return 统计信息
     */
    RouteInvoiceStatisticsDTO getRouteInvoiceStatistics();

    /**
     * 查询已开具发票列表
     * 
     * @param limit 限制数量
     * @return 已开具发票列表
     */
    List<RouteInvoiceVO> getIssuedInvoices(Integer limit);

    /**
     * 查询待开具发票列表
     * 
     * @param limit 限制数量
     * @return 待开具发票列表
     */
    List<RouteInvoiceVO> getPendingInvoices(Integer limit);

    /**
     * 查询已作废发票列表
     * 
     * @param limit 限制数量
     * @return 已作废发票列表
     */
    List<RouteInvoiceVO> getVoidInvoices(Integer limit);

    /**
     * 查询已红冲发票列表
     * 
     * @param limit 限制数量
     * @return 已红冲发票列表
     */
    List<RouteInvoiceVO> getRedRushInvoices(Integer limit);

    /**
     * 根据发票类型查询发票列表
     * 
     * @param invoiceType 发票类型
     * @param status 发票状态
     * @param limit 限制数量
     * @return 发票列表
     */
    List<RouteInvoiceVO> getInvoicesByType(String invoiceType, String status, Integer limit);

    /**
     * 根据时间范围查询发票列表
     * 
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param limit 限制数量
     * @return 发票列表
     */
    List<RouteInvoiceVO> getInvoicesByTimeRange(LocalDateTime startTime, LocalDateTime endTime, Integer limit);

    /**
     * 根据金额范围查询发票列表
     * 
     * @param minAmount 最小金额
     * @param maxAmount 最大金额
     * @param limit 限制数量
     * @return 发票列表
     */
    List<RouteInvoiceVO> getInvoicesByAmountRange(BigDecimal minAmount, BigDecimal maxAmount, Integer limit);

    /**
     * 根据税率查询发票列表
     * 
     * @param taxRate 税率
     * @param status 发票状态
     * @param limit 限制数量
     * @return 发票列表
     */
    List<RouteInvoiceVO> getInvoicesByTaxRate(BigDecimal taxRate, String status, Integer limit);

    /**
     * 根据路线查询发票列表
     * 
     * @param routeId 路线ID
     * @param status 发票状态
     * @param limit 限制数量
     * @return 发票列表
     */
    List<RouteInvoiceVO> getInvoicesByRoute(Long routeId, String status, Integer limit);

    /**
     * 根据商家查询发票列表
     * 
     * @param merchantId 商家ID
     * @param status 发票状态
     * @param limit 限制数量
     * @return 发票列表
     */
    List<RouteInvoiceVO> getInvoicesByMerchant(Long merchantId, String status, Integer limit);

    /**
     * 检查发票是否存在
     * 
     * @param id 发票ID
     * @return 是否存在
     */
    boolean existsById(Long id);

    /**
     * 检查发票编号是否存在
     * 
     * @param invoiceNo 发票编号
     * @param excludeId 排除的发票ID
     * @return 是否存在
     */
    boolean existsByInvoiceNo(String invoiceNo, Long excludeId);

    /**
     * 开具发票
     * 
     * @param invoiceId 发票ID
     * @param issueUser 开具人
     * @return 开具结果
     */
    boolean issueInvoice(Long invoiceId, String issueUser);

    /**
     * 作废发票
     * 
     * @param invoiceId 发票ID
     * @param voidUser 作废人
     * @param voidReason 作废原因
     * @return 作废结果
     */
    boolean voidInvoice(Long invoiceId, String voidUser, String voidReason);

    /**
     * 红冲发票
     * 
     * @param invoiceId 发票ID
     * @param redRushUser 红冲人
     * @param redRushReason 红冲原因
     * @return 红冲结果
     */
    boolean redRushInvoice(Long invoiceId, String redRushUser, String redRushReason);

    /**
     * 审核发票
     * 
     * @param invoiceId 发票ID
     * @param auditStatus 审核状态
     * @param auditUser 审核人
     * @param auditRemark 审核备注
     * @return 审核结果
     */
    boolean auditInvoice(Long invoiceId, String auditStatus, String auditUser, String auditRemark);

    /**
     * 认证发票
     * 
     * @param invoiceId 发票ID
     * @param certifyUser 认证人
     * @return 认证结果
     */
    boolean certifyInvoice(Long invoiceId, String certifyUser);

    /**
     * 计算指定时间范围内的发票总金额
     * 
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 发票总金额
     */
    BigDecimal calculateTotalInvoiceAmount(LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 计算指定时间范围内的税额总额
     * 
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 税额总额
     */
    BigDecimal calculateTotalTaxAmount(LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 计算指定时间范围内的发票数量
     * 
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param status 发票状态
     * @return 发票数量
     */
    Integer calculateInvoiceCount(LocalDateTime startTime, LocalDateTime endTime, String status);

    /**
     * 计算指定时间范围内的平均税率
     * 
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 平均税率
     */
    BigDecimal calculateAverageTaxRate(LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 搜索发票
     * 
     * @param keyword 关键词
     * @param searchType 搜索类型
     * @param limit 限制数量
     * @return 发票列表
     */
    List<RouteInvoiceVO> searchInvoices(String keyword, String searchType, Integer limit);

    /**
     * 导出发票列表
     * 
     * @param queryDTO 查询条件
     * @return 发票列表
     */
    List<RouteInvoiceVO> exportInvoiceList(RouteInvoiceQueryDTO queryDTO);

    /**
     * 获取发票趋势数据
     * 
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param trendType 趋势类型
     * @return 趋势数据
     */
    List<Map<String, Object>> getInvoiceTrends(LocalDateTime startTime, LocalDateTime endTime, String trendType);

    /**
     * 生成发票分析报告
     * 
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 分析报告
     */
    Map<String, Object> generateInvoiceAnalysisReport(LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 验证发票合规性
     * 
     * @param invoiceId 发票ID
     * @return 合规性检查结果
     */
    Map<String, Object> validateInvoiceCompliance(Long invoiceId);

    /**
     * 同步发票状态
     * 
     * @param invoiceId 发票ID
     * @param newStatus 新状态
     * @return 同步结果
     */
    boolean syncInvoiceStatus(Long invoiceId, String newStatus);
}